<?php

declare(strict_types=1);

// 开启严格模式
error_reporting(E_ALL);

// 在开发环境中开启，在生产环境中应关闭并记录日志
ini_set('display_errors', '1');

// 强制 session 仅使用 cookie，并设置 HttpOnly 标志防止 JS 访问
ini_set('session.use_only_cookies', '1');
session_set_cookie_params([
    'lifetime' => 3600,
    'path'     => '/',
    'domain'   => '',       // 根据你的域名设置
    'secure'   => true,     // 仅在 HTTPS 下发送
    'httponly' => true,     // JS 无法访问
    'samesite' => 'Strict'  // 防御 CSRF
]);

// Start session for CSRF and auth
session_start([
    'cookie_httponly' => true,
    // 'cookie_secure'   => true,   // Requires HTTPS
    'use_strict_mode' => true,
]);

// 路径常量
define('ROOT_PATH',   dirname(__DIR__));
define('APP_PATH',    ROOT_PATH . '/app');
define('CORE_PATH',   ROOT_PATH . '/core');
define('PUBLIC_PATH', ROOT_PATH . '/public');

// --- 加载 Composer 自动加载器 ---
require_once ROOT_PATH . '/vendor/autoload.php';

// --- 加载辅助函数和配置 ---
require_once APP_PATH . '/config.php';
require_once CORE_PATH . '/functions.php';

// --- 启动路由器 ---
try {
    $router = new core\Router();
    $router->dispatch();
} catch (\Throwable $e) {
    // 简单的错误处理
    // 在生产环境中，这里应该记录错误并显示一个友好的错误页面
    echo "<h1>An error occurred</h1>";
    echo "<p>" . e($e->getMessage()) . "</p>"; // 使用 e() 确保错误消息也被转义
    echo "<pre>" . e($e->getTraceAsString()) . "</pre>";
}